package com.zjsru.plan2024.normal;

/**
 * 67. 二进制求和
 *
 * @Author: cookLee
 * @Date: 2025-01-01
 */
public class AddBinary {
    /**
     * 主
     * \
     * 输入:a = "11", b = "1"
     * 输出："100"
     * \
     * 输入：a = "1010", b = "1011"
     * 输出："10101"
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        AddBinary addBinary = new AddBinary();
        String a = "1010";
        String b = "1011";
        System.out.println(addBinary.addBinary2(a, b));
    }

    /**
     * 添加二进制文件
     * 如果字符串超过 33 位，不能转化为 Integer
     * 如果字符串超过 65 位，不能转化为 Long
     *
     * @param a a
     * @param b b
     * @return {@link String}
     */
    public String addBinary(String a, String b) {
        return Integer.toBinaryString(Integer.parseInt(a, 2) + Integer.parseInt(b, 2));
    }

    public String addBinary2(String a, String b) {
        StringBuilder sb = new StringBuilder();
        int len = Math.max(a.length(), b.length());
        //上一个位置的进位，初始值为 0
        int carry = 0;
        for (int i = 0; i < len; i++) {
            //超过位数补0，否则按位数从后往前
            //减去字符0，由ascii码转换为对应的整数值
            carry += i < a.length() ? a.charAt(a.length() - 1 - i) - '0' : 0;
            carry += i < b.length() ? b.charAt(b.length() - 1 - i) - '0' : 0;
            sb.append(carry % 2);
            carry /= 2;
        }
        //此时满位需要多一格
        if (carry > 0) {
            sb.append('1');
        }
        return sb.reverse().toString();
    }

}
